Con esta línea de código cargamos todas las librerías, funciones y datos necesarios para esta práctica.
source("funciones.R")# Función para cargar e instalar librerías
cargar_librerias <- function(librerias) {
sapply(librerias, function(lib) {
# Cargar la librería, y si no existe instalar y cargar.
if(!require(lib, character.only = TRUE)) {
# Instalar paquete
install.packages(lib)
# Cargar librería
library(lib, character.only = TRUE)
}
})}
librerias <- c(
'data.table',
'tidyverse',
'lubridate',
'reactable')
cargar_librerias(librerias)Leemos todos los archivos contenidos en el directorio data y el resultado es una la lista con todos nuestros dataframes.
fun_leer_archivos("data")# Adquisición y preparación del dato
fun_leer_archivos <- function(carpeta_datos){
# Leer archivos de el directorio data
mis_tablas <<- list.files(carpeta_datos)
# Nombre de las tablas sin el csv
nombre_tablas <<- gsub(".csv", "", mis_tablas)
# Número de tablas
n_archivos <<- length(mis_tablas)
# Ruta del completa de cada archivo
mis_tablas_path <<- paste0(getwd(), "/data/", list.files("data"))
# creo una lista con totdas las tablas
lista_de_tablas <<- lapply(mis_tablas_path, fread)
# lista de tablas con nombre
lista_de_tablas <<- magrittr::set_names(lista_de_tablas, nombre_tablas)
}Extraemos de la lista todos los dataframes y los cargamos en el Enviroment.
Limpiamos todo el el entrono y nos quedamos únicamente con los datos que nos itersan.
# Obtenmeos los dataframe en el Environment
for (i in names(lista_de_tablas)) {
assign(paste0("df_", i), lista_de_tablas[[i]])
}
# Limpiar entorno
no_limpiar <- c(paste0("df_", nombre_tablas),'lista_de_tablas', 'fun_na_df', 'fun_na_lista')
rm(list = setdiff(ls(), no_limpiar));graphics.off();globalenv();cat("\014")Verificaremos que dataframes tienen NAs y los imputaremos a la media, y de nuevo limpiamos el entorno.
# Comprobamos los dataframe con NA ----
dataframes_NA <- fun_na_lista(lista_de_tablas)
dataframes_NA## $PF_rrss
## semana rrss_impresiones rrss_inversion
## 0 0 0
##
## $PF_sales
## mes sales
## 0 0
##
## $PF_sem
## semana sem_clicks sem_inversion
## 0 0 0
##
## $PF_tv
## mes tv_inversion
## 2 2
# Imputar los NA a la media en el dataframe df_PF_tv
df_PF_tv <- df_PF_tv %>% replace_na( list(
tv_inversion = mean(na.omit(df_PF_tv$tv_inversion)) # imputar a la media
))
# Limpiar entorno ----
no_limpiar <- c("df_PF_rrss", "df_PF_sales", "df_PF_sem", "df_PF_tv")
rm(list = setdiff(ls(), no_limpiar));graphics.off();globalenv();cat("\014")# Funciones para localizar NA en dataframe y en lista
# Función encontrar Na en dataframe
fun_na_df <- function(dataframe){
sapply(dataframe, function(x) sum(is.na(dataframe)))
}
# Función encontrar Na en lista de dataframes
fun_na_lista <- function(lista_df){
lista_df_NA <- lapply( X = lista_df , FUN = fun_na_df )
return(lista_df_NA)
}Uniremos los cuatro dataframes en un mismo dataframe, usando granularidad mensual y nos quedamos únicamente con el periodo de fechas coincidente.
Damos formato a las fechas
Ordenamos las fechas
Pasamos de semenas a meses, agrupamos por meses el df_PF_rrss y df_PF_sem
df_PF_rrss <- df_PF_rrss %>%
mutate(semana = as.Date(semana, format="%d/%m/%Y")) %>%
arrange(semana) %>%
mutate(mes = floor_date(semana, unit='month')) %>%
group_by(mes) %>%
summarise(rrss_impresiones = sum(rrss_impresiones),
rrss_inversion = sum(rrss_inversion))
df_PF_sales <- df_PF_sales %>%
mutate(mes = as.Date(mes, format="%d/%m/%Y")) %>%
arrange(mes)
df_PF_sem <- df_PF_sem %>%
mutate(semana = as.Date(semana, format="%d/%m/%Y")) %>%
arrange(semana) %>%
mutate(mes = floor_date(semana, unit='month')) %>%
group_by(mes) %>%
summarise(sem_clicks = sum(sem_clicks),
sem_inversion = sum(sem_inversion))
df_PF_tv <- df_PF_tv %>%
mutate(mes = as.Date(mes, format="%d/%m/%Y")) %>%
arrange(mes)# Comprobamos el rango de fechas de los dataframes
data.frame(
dataframe = c("df_PF_rrss", "df_PF_sales", "df_PF_sem", "df_PF_tv"),
fecha_minima = c(min(df_PF_rrss$mes),
min(df_PF_sales$mes),
min(df_PF_sem$mes),
min(df_PF_tv$mes)),
fecha_máxima = c(max(df_PF_rrss$mes),
max(df_PF_sales$mes),
max(df_PF_sem$mes),
max(df_PF_tv$mes))
) %>% reactable()df <- df_PF_rrss %>%
inner_join(df_PF_sales, by = "mes") %>%
inner_join(df_PF_sem, by = "mes") %>%
inner_join(df_PF_tv, by = "mes")El resultado lo podemos ver en esta tabla interactiva:
data.frame(
dataframe = "df",
fecha_minima = min(df$mes),
fecha_máxima = max(df$mes)
) %>% reactable()
# Limpiar entorno ----
no_limpiar <- "df"
rm(list = setdiff(ls(), no_limpiar));graphics.off();globalenv();cat("\014")Obtenemos una tabla con la inversión de cada medio en cada año, descartando 2015 y 2019, (dado que no están completos).
df_inversiones <- df %>%
mutate(anio = year(mes)) %>%
filter(anio !=2015 & anio !=2019) %>%
group_by(anio) %>%
summarise(rrss_inversion = sum(rrss_inversion),
sem_inversion = sum(sem_inversion),
tv_inversion = sum(tv_inversion)) Construimos una tabla que muestre la venta media de cada mes, descartando también 2015 y 2019.
df_ventas <- df %>%
mutate(meses = month(mes, label = T, abbr = F)) %>%
mutate(anio = year(mes)) %>%
filter(anio !=2015 & anio !=2019) %>%
group_by(anio, meses) %>%
summarise(media_ventas = mean(sales))Visualizamos la serie por meses de cada año para ver si existe estacionalidad.
plotly::plot_ly(data = df_ventas ,
x = ~meses, y = ~ media_ventas,
type="scatter",
mode='lines',
name = ~anio,
line = list(color = c('#048EE8','#000FFF','#FFF000'),
width = 2)) %>%
plotly::layout(title = 'Ventas por meses y por años')Hemos separado la serie de ventas por cada año para ver mejor la estacionalidad de las ventas. Y como claramente el mes de Junio hay un gran descenso en las ventas, mientras que los meses invernales son los que registran mayores ventas.
df_correlacion <- df %>%
select(!1) %>%
cor() %>%
as.data.frame() %>%
dplyr::slice(3:3) %>%
round(2)Claramente la variable inversión TV es la que mayor correlación guarda guarda con las ventas
Developed by: Aaron Benchiheub Pérez
aaronbenchiheubperez@gmail.com